package funcionesDeMutacion;

import java.util.ArrayList;

import util.Aleatorio;

import cromosomas.Arbol;
import cromosomas.CromosomaEstrategia;
import cromosomas.CromosomaEstrategia.Tipo;
import elementosEvolutivos.Cromosoma;
import elementosEvolutivos.FuncMutacion;

public class MutacionDeFuncion implements FuncMutacion {

	@Override
	public void mutar(Cromosoma cr) {
		CromosomaEstrategia cre = (CromosomaEstrategia)cr;
		ArrayList<Arbol> nodos = obtenerNodosIntermedios(cre.getArbol());
		if(nodos.size()!=0){
			int pos = Aleatorio.getIntAleatorio(nodos.size());
			Tipo t = nodos.get(pos).getTipo();
			if(t.equals(Tipo.PROGN2))
				nodos.get(pos).setTipo(Tipo.SIC);
			if(t.equals(Tipo.SIC))
				nodos.get(pos).setTipo(Tipo.PROGN2);
		}
	}
	
	private ArrayList<Arbol> obtenerNodosIntermedios(Arbol ar){
		ArrayList <Arbol> listaNodos = new ArrayList<Arbol>();
		if(ar.isNodo() && (ar.getTipo().equals(Tipo.PROGN2)||ar.getTipo().equals(Tipo.SIC)))
			listaNodos.add(ar);
		for(int i=0; i<ar.getNum_hijos(); i++)
			listaNodos.addAll(obtenerNodosIntermedios(ar.getHijos()[i]));
		return listaNodos;
	}

}
